﻿using Be.Timvw.Framework.ComponentModel;
using CristoRessuscitado.BancoDados;
using CristoRessuscitado.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CristoRessuscitado.Formularios
{
    public partial class FormConsultaCasais : Form, IFormConsultaPadrao
    {
        private DatabaseContext     dbContext;

        private int                 idEsposoRegistroSelecionado;
        private int                 idEsposaRegistroSelecionado;

        public FormConsultaCasais()
        {
            InitializeComponent();
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //
        // Eventos
        //
        // ---------------------------------------------------------------------------------------------------------------------------

        private void FormConsultaCasais_Load(object sender, EventArgs e)
        {
            Inicializar();
        }

        private void FormConsultaCasais_KeyDown(object sender, KeyEventArgs e)
        {
            OnTecladoKeyDown(e);
        }

        private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // Recupera o id pelo índice na grid
            try
            {
                idEsposoRegistroSelecionado = Convert.ToInt32(dgv.Rows[e.RowIndex].Cells[1].Value);
                idEsposaRegistroSelecionado = Convert.ToInt32(dgv.Rows[e.RowIndex].Cells[3].Value);
            }
            catch (Exception)
            {
                idEsposoRegistroSelecionado = -1;
                idEsposaRegistroSelecionado = -1;
            }
        }

        private void dgv_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (idEsposoRegistroSelecionado != -1)
            {
                AbrirFormularioParaAlteracaoRegistro();
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_alterar);
            }
        }

        private void dgv_Sorted(object sender, EventArgs e)
        {
            LimparSelecaoRegistro();
        }

        private void tbConjuge_TextChanged(object sender, EventArgs e)
        {
            Atualizar();
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            AbrirFormularioParaNovoRegistro();
            Atualizar();
        }


        private void btnExcluir_Click(object sender, EventArgs e)
        {
            if (idEsposoRegistroSelecionado != -1)
            {
                if (ValidarExcluirRegistroSelecionado())
                {
                    ExcluirRegistroSelecionado();
                    Atualizar();
                }
            }
            else
            {
                GeralUtils.ExibirDialogMsgValidacao(this, MensagensPadrao.txt_geral_selecione_registro_excluir);
            }
        }

        // ---------------------------------------------------------------------------------------------------------------------------
        //                                                                                                                           
        // Métodos Auxiliares                                                                                                        
        //                                                                                                                           
        // ---------------------------------------------------------------------------------------------------------------------------

        public void OnTecladoKeyDown(KeyEventArgs e)
        {
            if (e.KeyCode == (Keys.Escape))
            {
                Close();
            }
        }

        public void Inicializar()
        {
            dbContext = new DatabaseContext();
            KeyPreview = true;

            Atualizar();
        }

        public void Atualizar()
        {
            // Filtro
            string nomeConjuge = tbConjuge.Text.Trim();

            // Alimenta a Grid
            var lista = dbContext.VIEWCasal.ToList();

            lista = lista.Where(e => e.NomeCompletoEsposo.StartsWith(nomeConjuge, StringComparison.InvariantCultureIgnoreCase) 
                                 ||
                                e.NomeCompletoEsposa.StartsWith(nomeConjuge, StringComparison.InvariantCultureIgnoreCase)).ToList();

            var listaOrdenavel = new SortableBindingList<Object>(lista);

            dgv.DataSource = listaOrdenavel;

            lblTotalRegistros.Text = MensagensPadrao.lbl_geral_total_registros + listaOrdenavel.Count;

            // Configura a Grid
            GeralUtils.AplicarFormatacaoPadraoDGV(dgv);
            if (dgv.Rows.Count > 0)
            {
                dgv.Columns[0].HeaderText = "Data do Casamento";
                dgv.Columns[0].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dgv.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                dgv.Columns[1].Visible = false; // id do esposo
                dgv.Columns[2].HeaderText = "Esposo";
                dgv.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                dgv.Columns[3].Visible = false; // id da esposa
                dgv.Columns[4].HeaderText = "Esposa";
                dgv.Columns[4].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            }

            LimparSelecaoRegistro();
        }

        public void LimparSelecaoRegistro()
        {
            dgv.ClearSelection();
            idEsposoRegistroSelecionado = -1;
            idEsposaRegistroSelecionado = -1;
        }

        public void AbrirFormularioParaNovoRegistro()
        {
            FormCadCasal frm = new FormCadCasal();
            frm.ShowDialog(this);
        }

        public void AbrirFormularioParaAlteracaoRegistro()
        {}

        public void ExcluirRegistroSelecionado()
        {
            Casal casal = dbContext.Casal.Find(idEsposoRegistroSelecionado, idEsposaRegistroSelecionado);
            dbContext.Casal.Remove(casal);
            dbContext.SaveChanges();
        }

        public bool ValidarExcluirRegistroSelecionado()
        {
            // TODO
            return true;
        }
    }
}
